#ifndef SHAREDOUTPUTBOX_H_JM_20121213
#define SHAREDOUTPUTBOX_H_JM_20121213

#include "../../boxes/output/BinaryOperationResultIndexStreamWritterBox.h"
#include "../../boxes/output/StreamWriterBox.h"
#include "TesterSharedOutputBoxImpl.h"

#include <type_traits>
namespace jm4bbx {

	/**
	 * Zdielany vystupny box sluzi pre modely, kde je vystup rezlicovany do 
	 * skupiny separatnych boxov, ale z nejakeho dovodu by sa hodilo chovanie, 
	 * ze sa to leje do jedneho boxu. Principialne je vhodnejsie napisat spravny 
	 * model, ktory bude sypat vystup do jedneho boxu. Avsak pre potreby 
	 * testovania modelu ako celku pripadne testovanie pouzitych boxov je 
	 * ziaduce zachovat model co najviac podobny povodnemu. Preto zdielane box 
	 * drzia vnutornu implementaciu o ktoru sa vzaojmne delia -> na vonok sa 
	 * jedna o skupinu vystupnych boxov avsak vnutorne je obsah jednym boxom.
	 * 
	 * @tparam BoxImplT implementacia chovania boxu
	 * @tparam outputs pocet zdielajucich boxov
	 * @tparam distinctizer pokial je potrebne pouzit 2 a viac separatnych skupin 
	 * zdielajucich boxov potom je ich typy potrebne nejak od seba odlisit.
	 **/
	template<class BoxImplT>
	class SharedOutputBox : public /*StreamWriterBox*/
		BinaryOperationResultIndexStreamWritterBox {
	public:
		//static_assert(std::is_base_of<jm4bbx::TesterSharedOutputBoxImpl, BoxImplT>::value, 
		//	"SharedOutputBox<T>: Template parameter has to inherit SharedOutputComparator!");

		typedef BoxImplT BoxImpl;
		typedef StreamWriterBox::OutputStream OutputStream;

		SharedOutputBox(const BoxParamPack& p) 
			: BinaryOperationResultIndexStreamWritterBox(p) { 
				// nastavenie poctu boxov ktory budu sypat data 
				assert(counter_++ < impl_.getSharedOutputCount());
		}

		
		virtual OutputStream& getOutputStream() override { 				
			return impl_.getOutputStream();
		}
	private:
		static BoxImpl impl_;
		static int counter_;
	};

	template<class T>
	int SharedOutputBox<T>::counter_ = 0;

	template<class T>
	typename SharedOutputBox<T>::BoxImpl SharedOutputBox<T>::impl_;

} // namespace jm4bbx	

#endif
